#include <esp_log.h>
#include <c++/12.2.0/cstdio>

#include "lvgl.h"
#include "lvgl_control.hpp"
#include "button.hpp"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_timer_set.hpp"

extern uint32_t button_press_count;
lv_obj_t *ball;
// 小球的 x 和 y 方向速度
int ball_x_speed = 2;
int ball_y_speed = 2;


// 动画任务
static void ball_animation_task(void *arg) {
    while (1) {
        // 获取小球当前位置
        lv_coord_t ball_x = lv_obj_get_x(ball);
        lv_coord_t ball_y = lv_obj_get_y(ball);

        // 获取屏幕边界
        lv_coord_t screen_width = 160;
        lv_coord_t screen_height = 80;

        // 获取小球的宽度和高度
        lv_coord_t ball_width = lv_obj_get_width(ball);
        lv_coord_t ball_height = lv_obj_get_height(ball);

        // 检查是否碰撞到屏幕边缘
        if (ball_x + ball_width >= screen_width || ball_x < 0) {
            ball_x_speed = -ball_x_speed; // 反转 x 方向速度
        }
        if (ball_y + ball_height >= screen_height || ball_y < 0) {
            ball_y_speed = -ball_y_speed; // 反转 y 方向速度
        }

        // 更新小球位置
        lv_obj_set_x(ball, ball_x + ball_x_speed);
        lv_obj_set_y(ball, ball_y + ball_y_speed);

        // 处理 LVGL 任务
        lv_task_handler();

        // 适当延时，控制动画速度
        vTaskDelay(pdMS_TO_TICKS(100));
    }
}

void do_work() {
    lv_obj_t *scr = lv_scr_act();

    // 创建小球对象
    ball = lv_obj_create(scr);
    lv_obj_set_size(ball, 20, 20);
    lv_obj_set_style_radius(ball, LV_RADIUS_CIRCLE, 0);
    lv_obj_set_style_bg_color(ball, lv_palette_main(LV_PALETTE_RED), 0);
    lv_obj_align(ball, LV_ALIGN_TOP_LEFT, 0, 0);
    xTaskCreate(ball_animation_task, "ball_animation_task", 4096, nullptr, 1, nullptr);
}

void esp_timer_sever(void *arg) {
    ESP_LOGI("main", "Time serve");
    lv_tick_inc(1);
}

extern "C" [[noreturn]] void app_main() {
    // 初始化SPI屏幕
    button_init();
    LVGLControl lvglControl;
    LVGLControl::init();
    lvglControl.showNumInit();

    // do_work();
    uint32_t value = 0;
    esptim_int_init(10000, esp_timer_sever);
    // lvglControl.showHelloWorld();
    while (true) {
        value += 1;
        lvglControl.showNumInner(value);
        // 处理 LVGL 任务
        lv_timer_handler();
        // 适当延时
        vTaskDelay(pdMS_TO_TICKS(1000));
        // lvglControl.showExample();

    }
}
